package com.ctshk.rpc.tour.service;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

import com.ctshk.common.dto.Result;
import com.ctshk.common.enums.SystemBusinessType;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.tour.dto.ScheduleDetails;
import com.ctshk.rpc.tour.dto.schedule.*;
import com.ctshk.rpc.tour.req.schedule.*;

/**
 * <p>
 * 旅行团团期 服务类
 * </p>
 *
 * @author 谢诗宏
 * @since 2021-01-20
 */
public interface ISeriesTripScheduleService {


    SeriesTripScheduleDTO getTripScheduleId(Long id);
    
    /**
     * 查询线下自营预订团期详情
     * @return
     */
    SeriesTripScheduleDTO getTripScheduleIdBookOfflineSelf(Long id, Long userId);
    
    /**
     * 查询线下代理预订团期详情
     * @return
     */
    SeriesTripScheduleDTO getTripScheduleIdBookOfflineAgent(TripScheduleBookOfflineAgentFindReq req);

    /**
     * 修改已收客人数
     *
     * @param updateSchedulePassengerReq 修改属性
     * @return GroupTourConstants 是否可下单
     */
    Result updateSchedulePassengerReq(UpdateSchedulePassengerReq updateSchedulePassengerReq, TokenUser tokenUser);

    /**
     * 新增团期 数据
     *
     * @param addTripScheduleReqList 新增团期数据
     * @param tokenUser              登錄用戶
     */
    void addSchedule(List<AddTripScheduleReq> addTripScheduleReqList, TokenUser tokenUser);

    /**
     * 提供对外接口查询
     *
     * @param tripScheduleListIdReq 批量id
     * @return 团期列表数据
     */

    List<TripScheduleListDTO> getTripScheduleList(TripScheduleListIdReq tripScheduleListIdReq);

    /**
     * 团期管理列表查询
     *
     * @param tripScheduleListQueryReq 查询参数
     * @param tokenUser                登录用户
     * @return 团期管理列表
     */
    PageResponse<TripScheduleDTO> scheduleList(TripScheduleListQueryReq tripScheduleListQueryReq, TokenUser tokenUser);
    
    /**
     * 运营中心团期管理列表查询
     *
     * @param tripScheduleListQueryReq 查询参数
     * @param tokenUser                登录用户
     * @return 团期管理列表
     */
    PageResponse<TripScheduleDTO> scheduleListForIotc(TripScheduleListQueryReq tripScheduleListQueryReq, TokenUser tokenUser);

    /**
     * 修改团期属性
     *
     * @param updateTripScheduleReq 修改
     */
    void updateSchedule(UpdateTripScheduleReq updateTripScheduleReq, TokenUser tokenUser);

    /**
     * 查询成本
     *
     * @param scheduleId 团期id
     * @return 成本值
     */
    TripScheduleCostDTO getCost(Long scheduleId);

    /**
     * 查询团期补充信息等
     *
     * @param id 团期id
     * @return 团期详细
     */
    TripScheduleDetailsDTO getTripScheduleDetailsId(Long id);

    /**
     * 修改团期状态类型
     *
     * @param updateTripScheduleStatusReq 修改团期状态属性
     */
    void updateScheduleStatus(UpdateTripScheduleStatusReq updateTripScheduleStatusReq);

    /**
     * 修改团期状态
     *
     * @param updateTripStatusReq 状态属性
     */
    void updateTripStatusReq(UpdateTripStatusReq updateTripStatusReq);

    /**
     * 查询是否达到了成团要求
     *
     * @param id 团id
     * @return 是否达到了要求
     */
    TripScheduleGroupDTO group(Long id);

    /**
     * 通知派团
     *
     * @param tripScheduleNoticeReq 通知派团
     */
    void notice(TripScheduleNoticeReq tripScheduleNoticeReq, TokenUser tokenUser);

    /**
     * 茶会通知
     *
     * @param tripScheduleTeaPartyReq 茶会属性
     */
    void teaParty(TripScheduleTeaPartyReq tripScheduleTeaPartyReq, TokenUser tokenUser);

    /**
     * 行程详情--旅行团团期
     *
     * @param scheduleDepartureListQueryReq 查询条件
     * @return
     */
    List<ScheduleCalendarDTO> scheduleDepartureList(ScheduleDepartureListQueryReq scheduleDepartureListQueryReq);

    /**
     * 订单返回相应库存
     *
     * @param updateScheduleNumReq 团属性
     * @return 团属性
     */
    Result updateScheduleNum(UpdateScheduleNumReq updateScheduleNumReq);

    /**
     * 根据团期id查询出调整费用项
     *
     * @param id 团期id
     * @return 调整费用项目
     */
    List<TripScheduleAdjustmentDTO> adjustmentItems(Long id);

    /**
     * （旅行团预订）查询列表
     *
     * @param tripScheduleListQueryReq 查询参数
     * @param tokenUser                登录用户
     * @return
     */
    Result<PageResponse<TripScheduleDTO>> scheduleBookList(TripScheduleListQueryReq tripScheduleListQueryReq, TokenUser tokenUser);

    /**
     * 是否代理可下单
     *
     * @param tripScheduleAgentReq 团代理信息
     * @param tokenUser            当前登录用户信息
     * @return 能否下单
     */
    boolean scheduleAgent(TripScheduleAgentReq tripScheduleAgentReq, TokenUser tokenUser);

    List<Long> getTripScheduleByStatusAndDay(TripSchedulePriceReq tripSchedulePriceReq);

    List<Long> getTripScheduleByCreateTime(Long tripCreateIds);

    List<Long> getTripScheduleCount(List<Long> id);

    List<LocalDate> getTripScheduDepartureDateByTripId(Long id);

    List<ScheduleDetails> getTripScheduByTripId(Long id);

    Integer getSchedulePositionNumById( Long id);

    /**
     * 查询团期所属行程id
     * @param scheduleId
     * @return
     */
    Long findScheduleTripIdById(Long scheduleId);
    
    /**
     * 导出团期列表
     * @param req
     */
    List<TripScheduleDTO> exportScheduleList(TripScheduleListQueryReq req, TokenUser tokenUser);
    
    /**
     * 查询系列团预订可下单的代理商列表
     * @param req
     * @return
     */
    Result<List<SeriesAgentByBookDTO>> querAgentListByBook(SeriesAgentListByBookQueryReq req);
    
    /**
     * 自营下单查询团期详情
     * @param id
     * @return
     */
    Result<SeriesTripScheduleDTO> findTripScheduleBySelf(Long id);

    /**
     * 查询旅行团详情（加幅价格）
     * @param findTripScheduleReq 团期id
     * @param tokenUser 登录用户
     * @return 团期加幅信息
     */
    SeriesTripScheduleDTO findTripScheduleId(FindTripScheduleReq findTripScheduleReq, TokenUser tokenUser);

    /**
     * 操作订单-调整项目列表
     * @param id
     * @return
     */
    Result<TripScheduleAdjustProjectDTO> adjustProjectList(Long id);

    /**
     * 查询团期状态（内部接口）
     * @param idList
     * @return
     */
    List<TripScheduleGuideDTO> getScheduleList(List<Long> idList);
    
    /**
     * 查询团期基础信息
     * @return
     */
    SeriesTripScheduleBasicDTO findScheduleBasic(Long scheduleId);

    /**
     * 推广码-旅行团列表(内部接口)
     * @param idList
     * @return
     */
    List<TripScheduleItocDTO> queryScheduleListByIdList(List<Long> idList,Integer businessType);

    /**
     * 查询团期可销售余位
     * @param id
     * @return
     */
    Integer queryScheduleRemain(Long id);

    /**
     * 下单锁位
     * @param id
     * @return
     */
    Result updateScheduleNum(Long id,Integer num);

    /**
     * 扣掉余位数
     */
    Integer substrateTouristNum(Long id,Integer num);

    /**
     * 根据团号获取团期ID（内部接口）
     * @param tripNumber
     * @return
     */
    Long queryIdByTripNumber(String tripNumber);

    /**
     * 计算产品售价信息逻辑处理
     *
     * @param strategyType 加幅类型，1：自营；2：代理；3：官方平台；4：第三方平台；
     * @param productId    产品ID
     * @param relId        关联ID，strategyType(1：用户ID；2：代理ID；3：渠道ID；4：渠道ID)
     * @param amount       金额
     * @return
     */
    BigDecimal calcSalePriceInfoHandle(int strategyType, Long productId, Long relId, BigDecimal amount);

    /**
     * 获取加幅后的团费
     * @param orderType
     * @param scheduleId
     * @param groupFee
     * @param userId
     * @return
     */
    BigDecimal getAddGroupFee(Integer orderType, Long scheduleId, BigDecimal groupFee, Long userId);
}
